230415 Hundred Finance

Abstract

2023 年 4 月 15 日发生的一起攻击事件,Hundred Finance 是部署在 Optimism 上的一个多链借款协议,在这次攻击中,它损失了约 $7 Million。

Background

WBTC and BTC

BTC 就是众所周知的比特币;而 WBTC 的全称是 Wrapped BTC,是在以太坊区块链上运行的,和 BTC 价格相同的虚拟货币。将 BTC 兑换为 WBTC 的过程中,需要将 BTC 锁定在比特币区块链上,并与一个受信任的第三方(如 BitGo)进行交易换取铸造的 WBTC。

ERC-20

ERC-20 是一个同质化代币标准,它具有一种属性:每个代币都与另一个代币(在类型和价值上)完全相同。ETH、USDT、BNB 等常见的虚拟货币都属于 ERC-20。ERC-20 的功能包括但不限于:

  • 将代币从一个账户转到另一个账户
  • 获取账户的当前代币余额
  • 获取网络上可用代币的总供应量
  • 批准一个账户中一定代币金额由第三方账户使用
ERC and EIP

EIP 的全称是 Ethereum Improvement Proposal,是 Ethereum 的技术规范;而 ERC 是 Ethereum Request for Comments,它讨论的范围是“程序层级的标准和规范”,属于 EIP 中的一个项目。

Hundred Finance

Abstract

Hundred Finance 是 Compound v2 的一个分支(fork)。

hTOKENS

当代币被提供给 Hundred Finance 协议的各个市场时,相应的 hTOKENS 将被铸造并由供应商的钱包接收(例如 ETH 铸造 hETH)。这些 hTOKENS 是根据 ERC20 标准发行的用户存款的计息代币化代表。每当用户铸造、赎回、借入、偿还、清算账户或转移 hTOKENS 时,都是通过与相关 hTOKEN 合约的交互来完成的。

hWBTC

hWBTC 的全称为 Hundred WBTC,是 Hundred Finance 发行的一种代币,可与 WBTC 进行兑换。

Vulnerabilities

舍入错误

Hundred Finance Attack 的主要问题出在,它在换算 redeemTokens 时,理论上 redeemTokens 的值应该是 2,实际计算出的 1.999999999960024 会被舍入到 1。这就导致了赎回金额的偏差(即便只是偏差了 1wei,但是在价格操控后的场景下,仍然十分有利可图)。

Pasted image 20231030162805.png

流动性差

流动性越差的池子就越容易被价格操控。本次攻击事件发生的 hWBTC 池子,由于没有其他任何的交易者,导致攻击者可以在计算误差产生的 2wei hWBTC 上大做文章,通过借入 500 WBTC 导致了 hWBTC 在 Hundred Finance 中的极大汇率。

Attack Process

Pasted image 20231030145523.png

首先,Attack Account1 赎回池子中原有的 WBTC

Pasted image 20231030160432.png

攻击者创建新账号 Attack Account2,并通过先借入后赎回 4 WBTC 的操作,故意留下 2wei hWBTC

Attack Account2 随后借入 500.3 WBTC 以大幅提高 hWBTC 的汇率(价格操控)。

在赎回先前借入的 500.3 WBTC 时,由于舍入错误,原本要赎回的 2wei hWBTC 被向下取整到 1 wei,进而产生了 1wei hWBTC 的结余。

关键计算函数位置见 Phalcon

Attack Account2 利用这 1wei hWBTC 兑换了 1021.9 Ether,即本次攻击的收益。

Pasted image 20231108160306.png

攻击者反复利用此方法攻击了 Hundred Finance 的若干池子,兑换了包括 USDTEtherUSDC 在内的诸多代币。

Reference